#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
日志配置模块
配置loguru日志记录器的输出格式和文件设置，并提供timer装饰器
"""

import time
from pathlib import Path
from functools import wraps
from typing import Any, Callable
from loguru import logger

def configure_logger(name: str = "water_supply", log_level: str = "INFO") -> None:
    """
    配置日志记录器
    
    Args:
        name: 日志文件名前缀
        log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
    """
    # 获取项目根目录
    project_root = Path(__file__).parent.parent
    
    # 确保日志目录存在
    log_dir = project_root / 'log'
    log_dir.mkdir(exist_ok=True)
    
    # 创建带时间戳的日志文件
    log_time = time.strftime("%Y-%m-%d-%H-%M-%S")
    log_file = log_dir / f'{name}_{log_time}.log'
    
    # 使用默认的控制台处理器配置
    # loguru 默认已经配置了控制台输出，无需额外配置
    
    # 添加文件处理器
    logger.add(
        sink=str(log_file),
        format="{time:YYYY-MM-DD HH:mm:ss} - {name} - {level} - {message}",
        level="DEBUG",
        encoding="utf-8",
        rotation="10 MB",  # 日志文件大小超过10MB时轮转
        retention="30 days"  # 保留30天的日志文件
    )


def log_parameter_info(config_data: dict) -> None:
    """
    记录模型关键参数信息
    
    Args:
        config_data: 包含模型配置数据的字典
    """
    general_params = config_data.get('general_parameters', {})
    
    logger.info(f"模型名称: {general_params.get('model_name', 'Unknown')}")
    logger.info(f"开始时间: {general_params.get('start_time', 'Unknown')}")
    logger.info(f"结束时间: {general_params.get('end_time', 'Unknown')}")
    
    if 'reservoirs' in config_data:
        logger.info(f"水库数量: {len(config_data['reservoirs'])}")
    
    if 'water_users' in config_data:
        logger.info(f"用水户数量: {len(config_data['water_users'])}")

def timer(func: object) -> Any:
    """
    装饰器：记录函数的开始、结束时间和运行时长
    
    Args:
        func: 要装饰的函数
        
    Returns:
        装饰后的函数
    """
    @wraps(func)
    def wrapper(*args, **kwargs) -> Any:
        logger.info("Start running {}", func.__name__)
        start_time = time.time()
        result = func(*args, **kwargs)
        run_time = time.time() - start_time
        logger.info(
            "Finished {} in {:.2f} secs", func.__name__,
            run_time
        )
        return result
    return wrapper


# 自动配置日志记录器
configure_logger()